package com.wangzhen.spring.inject;

import com.wangzhen.spring.inject.holder.UserHolder;
import com.wangzhen.spring.ioc.dependcy.entity.User;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;

/**
 * 通过Spring API的方式生成一个UserHolder的beanDefinition，并指定UserHolder#user的引用
 */
public class ApiSetterInjectDemo {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(ApiSetterInjectDemo.class);
        // 使用注解方式驱动的AnnotationConfigApplicationContext，也可以加载xml配置
        // 因为UserHolder使用的user bean是在xml中配置的，所以此处load xml，加载user bean
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(applicationContext);
        reader.loadBeanDefinitions("classpath:/META-INF/dependcy-setter-context.xml");
        // 启动应用上下文
        applicationContext.refresh();

        /////////////////////手工定义UserHolder的beanDefinition//////////////////////
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserHolder.class);
        beanDefinitionBuilder.addPropertyReference("user", "user");
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        // 向应用上下文中注册bean定义
        applicationContext.registerBeanDefinition("userHolder", beanDefinition);

        // 获取UserHolder
        UserHolder userHolder = applicationContext.getBean(UserHolder.class);
        System.out.println(userHolder);
        // 关闭应用上下文
        applicationContext.close();

    }

}
